package com.situ.ssh.dao.impl;

import com.situ.ssh.dao.IBaseDao;
import org.hibernate.SessionFactory;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport;

import javax.annotation.Resource;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;

public class BaseDaoImpl<T> extends HibernateDaoSupport implements IBaseDao<T> {
    // 代表当前操作实体类的类型 Student.class User.class
    private Class<T> entityClass;

    //注入Spring容器中的会话工厂，在Spring容器中已经创建好了
    //注解可以用在属性也可以用在方法，扫描到方法会调用，方法的参数会从容器中找
    @Resource
    public void setMySessionFactory(SessionFactory sessionFactory) {
        //HibernateDaoSupport需要使用SessionFactory
        super.setSessionFactory(sessionFactory);
    }

    public BaseDaoImpl() {
        // this:当前运行的类(UserDaoImpl/StudentDaoImpl)
        // this.getClass():当前运行类的字节码:UserDaoImpl.class/StudentDaoImpl.class
        // this.getClass().getGenericSuperclass():当前运行类的父类即为：BaseDaoImpl<User>
        Type type = this.getClass().getGenericSuperclass();
        // 强制转化为参数化类型BaseDaoImpl<User.clsss>
        ParameterizedType superClass = (ParameterizedType) type;
        // BaseDaoImpl<User,Student>参数可以有多个
        Type[] actualTypeArguments = superClass.getActualTypeArguments();// [User.class]
        // 获取数组中第一个元素
        entityClass = (Class<T>) actualTypeArguments[0];
    }

    public void save(T entity) {
        getHibernateTemplate().save(entity);
    }

    public void deleteById(T entity) {

    }

    public void update(T entity) {

    }

    public T findById(Integer id) {
        // getHibernateTemplate().get(User.class, id);
        return getHibernateTemplate().get(entityClass, id);
    }

    public List<T> findAll() {
        //String sql = "FROM User";
        String sql = "FROM " + entityClass.getSimpleName();
        return (List<T>)getHibernateTemplate().find(sql);
    }
}
